iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0

介面(Interface)

在Java中,介面(Interface)是一個強大的概念,它允許我們定義抽象的方法集合,這些方法可以被多個類實現。它提供了一種實現多重繼承的方式,同時幫助我們實現代碼的結構化和解耦。介面也是類別的一種,作用很像抽象類別,不得直接用 “new” 產生新物件,其內部之方法程序只有名稱,沒有實作區塊,較抽象類別更為嚴格。

介面宣告方式

存取修飾元 interface 名稱 extends 父介面1,父介面2{
		常數
		抽象方法
		內部類別、介面、枚舉定義
		default方法、類別方法
}

例如:public interface Ipuppy

從上面程式碼中可以看出來,介面裡不能包含建構子和初始化區域

介面裡只能包含:

  1. 成員變數(只能是靜態常數)
  2. 抽象方法
  3. 內部類別、介面、枚舉定義
  4. default方法、類別方法

成員變數

int MAX_SIZE = 50;

在介面內定義常數,系統會自動為這些變數 加上 public static final ,而且介面裡沒有建構子和初始化區域,所以在定義時就需要指定預設值。

public static final int MAX_SIZE = 50;

抽象方法

void out();

定義普通方法,系統會自動為這些方法 加上 public abstract修飾,所以要注意的是定義這些普通方法不能有方法實作,即不能有{ }

內部類別、內部介面、內部枚舉

不管有沒有定義修飾詞,預設都是採用public static

default方法、類別方法

default void test(){ }

static void staticTest(){ }

在介面中唯一可以有{ } 就是上面這兩個方法

default方法

  1. 預設方法就是介面中定義帶有 { } 的實現方法,等於一般class 裡的方法,但預設方法只能出現在介面中。
  2. 子類可以直接繼承使用,不需要去實現(改寫) 。

介面的繼承

介面的繼承和類別繼承不一樣,介面完全支援多重繼承,即一個介面可以有多個直接父介面。和類別繼承相似,子介面擴展某個父介面,將會獲得父介面裡定義的所有抽象方法、常數。

一個介面繼承多個父介面時,多個父介面排在 extends 開鍵宇之後,多個父介面之間以英文逗號(,)隔開。

interface interfaceA{
	int PROP_A= 5;
	void testA():
}
interface interfaceB{
	int PROP_B = 6;
	void testB();
}
interface interfaceC extends interfaceA, interfaceB{
	int PROP_C = 7;
	void testc();
}
public class InterfaceExtendsTest{
	public static void main(String[] args){
		System.out.println(interfaceC.PROPA);
		System.out.println(interfaceC.PROP_B);
		System.out.println(interfaceC.PROP_C);
	}
}

/*
結果:
5
6
7
*/

使用介面

介面用途:

  1. 定義變數,也可用於進行強制類型轉換
  2. 呼叫介面中定義的常數
  3. 被其他類别實作

介面多重繼承的語法:

interface 介面 extends 父介面1, 父介面2, ...
{
	//新增的靜態常數及抽象方法
}

類別實作多個介面的語法:

class 類別名稱 implements 介面1, 介面2, ...
{
	//類別主體敘述
}

一個類别可以實作一個或多個介面,繼承使用 extends 關鍵字,實作則使用implements 關鍵字。因為一個類别可以實作多個介面,這也是Java 為單一繼承靈活性不足所做的補充。

規則:

  1. 實作介面與繼承父類别相似,一樣可以獲得所實作介面裡定義的常數(成員變數)、方法(包括抽象方法和預設方法)。
  2. 讓類別實作介面需要類別定義後增加 implements 部分,當需要實作多個介面時,多個介面之間以英文逗號(,)隔開。一個類別可以繼承一個父類别,並同時實作多個介面,implements 部分必須放在extends 部分之後。
  3. 一個類別實作了一個或多個介面之後,這個類别必須完全實作這些介面裡所定義的全部抽象方法(也就是覆寫這些抽象方法);否則,該類別將保留從父介面那裡繼承承到的抽象方法,該類別也必須定義成抽象類別。

public class Interface01 {
	public static void main(String[] args) {
		//1.宣告子類,再建立子類物件+執行
		Type_C c = new Player();
		c.conn();
		c.exit();
		
		//2.臨時產生子類件:宣告+執行
		Type_C c2 = new Type_C() {
			int a = 100;
			void AA() {System.out.println(a);}
			@Override
			public void conn() {
				System.out.println("傳輸檔案2");
			}
			@Override
			public void exit() {
				System.out.println("安全退出2");
			}
		};
		c2.conn();
		c2.exit();
		
	}
}
//---------------------------
interface Type_C{
	String m = "D02";//一律為常數 public static final
	//void XX() {}//不可出現一般方法
	//Type_C(){}//不可有建構方法 
	//static {}
	//替代一般方法:1) static方法 2)default方法-->不需要子類改寫 
	default void XX() {}
	static void XXX() {}
	void conn();//一律為 public abstract
	void exit();
}
class Player implements Type_C{
	@Override
	public void conn() {
		System.out.println("傳輸檔案");
	}
	@Override
	public void exit() {
		System.out.println("安全退出");
	}
}

補充說明:上面的@Override

覆寫(Override)

Java的覆寫(Override)是指子類別繼承父類別時,改寫父類別原有的方法內容。

上例的 標註( Annotations )— @Override,只是一個好習慣,而非規定!

告知編譯器,此方法試圖 覆寫 父類別方法,並幫助開發時釐清 方法 的類別層級。


上一篇
Day 22 其他類 II
下一篇
Day 24 比較介面和抽象類別
系列文
玩轉Java:從基礎打造你的程式超能力30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言